# 一个规则
# 目标：依赖条件
# （一个tab缩进）命令
# 1、目标的时间必须晚于依赖条件的时间，否则，更新目标
# 2、依赖条件如果不存在，找寻新的规则去产生依赖条件

# ALL：指定makefile的终极目标

# 两个函数
# 1、匹配当前工作目录下的所有.c文件。将文件名组成列表，赋值给变量src。src = add.c div1.c hello.c
#src = $(wildcard *.c) # src = add.c sub.c div1.c hello.c

# 2、将参数3中，包含参数1的部分，替换为参数2。obj = add.o div1.o hello.o
#obj = $(patsubst %.c, %.o, $(src)) # obj = add.o div1.o hello.o


#All:a.out
#
#a.out: $(obj)
#	gcc $(obj) -o a.out
#	
#add.o:add.c
#	gcc -c add.c -o add.o
#	
#hello.o:hello.c
#	gcc -c hello.c -o hello.o
#	
#div1.o:div1.c
#	gcc -c div1.c -o div1.o
#	
#clean:
#	-rm -rf $(obj) a.out
#	
## 三个自动变量
## $@ 在规则命令中，表示规则中的目标   
## $^ 在规则命令中，表示规则中的所有条件，组成一个列表，以空格隔开，如果这个列表中有重复的项，则消除重复项
##    如果将该变量应用在模式规则中，它可将依赖条件列表中的依赖依次取出，套用模式规则。
## $< 在规则命令中，表示规则中的第一个依赖条件
#
## 模式规则
## %.o:%.c 
##    gcc -c $< -o $@
#
#
#
#
## 改造1
#src = $(wildcard *.c) # src = add.c div1.c hello.c
#
#obj = $(patsubst %.c, %.o, $(src)) # obj = add.o div1.o hello.o
#
#
#All:a.out
#
#a.out: $(obj)
#	gcc $^ -o $@
#	
#add.o:add.c
#	gcc -c $< -o $@
#	
#hello.o:hello.c
#	gcc -c $< -o $@
#	
#div1.o:div1.c
#	gcc -c $< -o $@
#	
#clean:
#	-rm -rf $(obj) a.out
#

# 改造2
#src = $(wildcard *.c) # src = add.c div1.c hello.c
#
#obj = $(patsubst %.c, %.o, $(src)) # obj = add.o div1.o hello.o
#
#
#All:a.out
#
#a.out: $(obj)
#	gcc $^ -o $@
#	
## 替换为如下模式规则
#%.o:%.c
#	gcc -c $< -o $@
#	
#
#clean:
#	-rm -rf $(obj) a.out
#
#.PHONY: clean ALL


# gaizao3
#src = $(wildcard ./src/*.c) # src = add.c div1.c hello.c
#
#obj = $(patsubst ./src/%.c, ./obj/%.o, $(src)) # obj = add.o div1.o hello.o
#
#inc_path=./inc
#
#myArgs= -Wall -g
#
#All:a.out
#
#a.out: $(obj)
#	gcc $^ -o $@ $(myArgs)
#        
## 替换为如下模式规则
#$(obj):./obj/%.o:./src/%.c
#	gcc -c $< -o $@ $(myArgs) -I $(inc_path)
#        
#
#clean:
#	-rm -rf $(obj) a.out
#
#.PHONY: clean ALL

# gaizao3
src = $(wildcard *.c) # src = add.c div1.c hello.c

obj = $(patsubst %.c, %.o, $(src)) # obj = add.o div1.o hello.o


myArgs= -Wall -g -lpthread

All:a.out

a.out: $(obj)
	gcc $^ -o $@ $(myArgs)
        
# 替换为如下模式规则
$(obj):%.o:%.c
	gcc -c $< -o $@ $(myArgs) 
        

clean:
	-rm -rf $(obj) a.out

.PHONY: clean ALL
